/**
 * 
 */
package com.jintian.smart.kernel.common.expr.op.define;

import com.alibaba.fastjson.util.TypeUtils;
import com.jintian.smart.kernel.common.expr.datameta.BaseDataMeta;
import com.jintian.smart.kernel.common.expr.datameta.Constant;
import com.jintian.smart.kernel.common.expr.op.Operator;
import com.jintian.smart.kernel.core.expr.IllegalExpressionException;

import java.math.BigDecimal;

/**
 *
 * 算术乘法操作
 * 
 */
public class Op_MUTI extends Op_Base {
	public Op_MUTI() {
		super(Operator.MUTI);
	}

	public Constant execute(Constant[] args) throws IllegalExpressionException {
		Object[] params = this.getParameterValues(args);
		Constant ret = this.numberVerifyResult(-1, args);
		BigDecimal value = TypeUtils.castToBigDecimal(params[0]).multiply(TypeUtils.castToBigDecimal(params[1]));
		if (ret.getDataType().equals(BaseDataMeta.DataType.DATATYPE_BIGDECIMAL)) {
			ret.setDataValue(value);
		} else if (ret.getDataType().equals(BaseDataMeta.DataType.DATATYPE_DOUBLE)) {
			ret.setDataValue(value.doubleValue());
		} else if (ret.getDataType().equals(BaseDataMeta.DataType.DATATYPE_FLOAT)) {
			ret.setDataValue(value.floatValue());
		} else if (ret.getDataType().equals(BaseDataMeta.DataType.DATATYPE_LONG)) {
			ret.setDataValue(value.longValue());
		} else if (ret.getDataType().equals(BaseDataMeta.DataType.DATATYPE_INT)) {
			ret.setDataValue(value.intValue());
		}
		return ret;
	}

	public Constant verify(int opPositin, BaseDataMeta[] args) throws IllegalExpressionException {
		this.checkParameterCount(opPositin, args);
		return this.numberVerifyResult(opPositin, args);
	}

}
